package 变量和数据类型;
/*
    静态代码块：
        1.static代码块也叫静态代码块，作用就是对类进行初始化，而且它随着类的加载而执行，并且
            只会执行一次，如果是普通代码块，每创建一个对象，就执行一次
        2.类什么时候被加载
            a.创建对象实例时
            b.创建子类对象实例，父类也会被加载
            c.使用类的静态成员时(静态属性，静态方法)
        3.普通的代码块，在创建对象实例时，会被隐士的调用，被创建一次，就会调用一次
            如果只是使用类的静态成员时，普通代码块不会被执行
     小结：
        1.static代码块是类加载时，执行，且只会执行一次
        2.普通代码块是在创建对象的时候调用的，创建一次，就调用一次
 */
public class 静态代码块 {
    public static void main(String[] args) {

        //1.创建实例对象类被加载，静态代码块被执行
        //Movie movie = new Movie("Tom");

        //2.创建子类对象，父类也会被加载，而且父类会先被加载，子类后加载
        //AA aa = new AA();

        //3.使用类的静态成员的时候(静态方法，静态变量),类也会被加载，
        // 静态代码块会被执行，普通代码块不会被执行
        //System.out.println(CC.aa);

        //创建多个实例，静态代码块只会被执行一次
        //CC cc = new CC();
        //CC cc1 = new CC();

        //普通代码块，每创建一个实例，就调用一次
        CC cc1 = new CC();
        CC cc2 = new CC();
    }
}

class CC{
    public static int aa = 10;
    {
        System.out.println("普通代码块");
    }
    static {
        System.out.println("CC的静态代码块");
    }
}

class BB{
    static {
        System.out.println("BB的静态代码块");
    }
}

class AA extends BB{
    static {
        System.out.println("AA的静态代码块");
    }
}

class Movie{
    private String name;
    private double price;
    private String director;

    static {
        System.out.println("static");
    }

    public Movie(String name) {
        this.name = name;
        System.out.println("name=" + name);
    }

    public Movie(String name, double price) {
        this.name = name;
        this.price = price;
    }


    public Movie(String name, double price, String director) {
        this.name = name;
        this.price = price;
        this.director = director;
    }
}
